// @ts-nocheck
const { successMsg, errorMsg } = require('../public/constant.js')
function executeTransaction({pool,res,queries}) {
    pool.getConnection((err, db) => {
        if (err) {
            return res.status(500).send(errorMsg('数据库错误'));
        }
        db.beginTransaction(err => {
            if (err) {
                return res.status(500).send(errorMsg('数据库错误'));
            }
            executeQueries({db, queries, index:0, res});
        });
    });
}

function executeQueries({db, queries, index, res,result={},commitEvent}) {
    console.log(result)
    if (index >= queries.length) {
        db.commit(function (err) {
            if (err) {
                return db.rollback(function () {
                    res.status(500).send(errorMsg('数据库错误'))
                    throw err;
                });
            }
            if(commitEvent){
                commitEvent(result)
            }
        });
        return;
    }
    let { sql, params, stopFlag, stopEvent,successEvent,modifyParamsEvent,precheck,precheckEvent } = queries[index];
    // 修改参数
    if(modifyParamsEvent){
        params=modifyParamsEvent(params,result)
    }
    // 预检，判断是否继续执行sql
    if(precheck&&!precheck(params,result)){
        return db.rollback(function () {
            precheckEvent(params,result)
        });
    }
    db.query(sql, params, (err, result) => {
        if (err) {
            return db.rollback(function () {
                res.status(500).send(errorMsg('数据库错误'));
                throw err;
            });
        }
        // 根据结果来判断是否继续执行
        if (stopFlag && stopFlag(result)) {
            return db.rollback(function () {
                stopEvent(result)
            });
        }
        // 不为最后一次sql则执行其成功语句
        if (successEvent&&index<queries.length-1) {
            successEvent(result);
        }
        executeQueries({db,queries,index:index+1,res,result,commitEvent:successEvent});
    });
}

module.exports= { executeTransaction }
